/**
 * @desc    封装多开窗口
 * @author: YXY  Q：282310962
 * @time    2022.10
 */

import { WebviewWindow, getAllWebviewWindows } from '@tauri-apps/api/webviewWindow';
import { emit, listen } from '@tauri-apps/api/event'

import { setWin } from './actions'

// 系统参数配置
export const windowConfig = {
    label: null,            // 窗口唯一label
    title: '',              // 窗口标题
    url: '',                // 路由地址url
    width: 900,             // 窗口宽度
    height: 640,            // 窗口高度
    minWidth: null,         // 窗口最小宽度
    minHeight: null,        // 窗口最小高度
    x: null,                // 窗口相对于屏幕左侧坐标
    y: null,                // 窗口相对于屏幕顶端坐标
    center: false,           // 窗口居中显示
    resizable: true,        // 是否支持缩放
    maximized: false,       // 最大化窗口
    decorations: true,     // 窗口是否无边框及导航条
    alwaysOnTop: false,     // 置顶窗口
}


class Windows {
    mainWin: null;
    constructor() {
        this.mainWin = null
    }

    // 获取窗口
    getWin(label: string) {
        return WebviewWindow.getByLabel(label)
    }

    // 获取全部窗口
    getAllWin() {
        return getAllWebviewWindows()
    }

    // 创建新窗口
    async createWin(options: any) {
        const args = Object.assign({}, windowConfig, options)
        console.log("000000" + args.url)
        // 判断窗口是否存在
        const existWin = getAllWebviewWindows().find(w => w.label == args.label)
        if(existWin) {
            if(existWin.label.indexOf('main') == -1) {
                await existWin?.unminimize()
                await existWin?.setFocus()
                return
            }
            await existWin?.close()
        }

        // 创建窗口对象
        let win = new WebviewWindow(args.label, args)
        
        // 是否最大化
        if(args.maximized && args.resizable) {
            win.maximize()
        }

        // 窗口创建完毕/失败
        win.once('tauri://created', async() => {
            console.log('window create success!')
        })

        win.once('tauri://error', async() => {
            console.log('window create error!')
        })
    }

    // 开启主进程监听事件
    async listen() {
        console.log("------")
        // 创建新窗体
        await listen('win-create', async (event:any) => {
            console.log(event)
            await this.createWin(event.payload)
        })

        // // 显示窗体
        // await listen('win-show', async(event) => {
        //     if(appWindow.label.indexOf('main') == -1) return
        //     await appWindow.show()
        //     await appWindow.unminimize()
        //     await appWindow.setFocus()
        // })

        // // 隐藏窗体
        // await listen('win-hide', async(event) => {
        //     if(appWindow.label.indexOf('main') == -1) return
        //     await appWindow.hide()
        // })

        // 退出应用
        await listen('win-exit', async(_event:any) => {
            setWin('logout')
            await exit()
        })

        // 重启应用
        await listen('win-relaunch', async(_event:any) => {
            await relaunch()
        })

        // 主/渲染进程传参
        await listen('win-setdata', async(event:any) => {
            await emit('win-postdata', JSON.parse(event.payload))
        })
    }
}

export default Windows



function exit() {
    throw new Error('Function not implemented.');
}

function relaunch() {
    throw new Error('Function not implemented.');
}

